Stack (স্ট্যাক)
স্ট্যাক হল একটি স্মৃতি এলাকা যা সাধারণত LIFO (Last In, First Out) পদ্ধতিতে কাজ করে। এটি দ্রুত মেমোরি অ্যাক্সেস এবং প্রোগ্রামের নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। স্ট্যাক মূলত ফাংশন কল, লোকাল ভেরিয়েবল এবং রিটার্ন অ্যাড্রেসগুলির জন্য ব্যবহৃত হয়। যখন একটি ফাংশন কল করা হয়, তার সকল স্থানীয় ভেরিয়েবল এবং রিটার্ন অ্যাড্রেস স্ট্যাকের মধ্যে রাখা হয় এবং ফাংশনটি সম্পন্ন হওয়ার পর স্ট্যাক থেকে মুছে ফেলা হয়।
স্ট্যাকের বৈশিষ্ট্য:
- ডেটা অ্যাক্সেস দ্রুত: স্ট্যাকের মেমোরি অ্যাক্সেস সাধারণত খুব দ্রুত হয়, কারণ এটি মেমোরির একেবারে উপরের অংশে অ্যাক্সেস করে।
- ফাংশন কলের জন্য ব্যবহৃত: ফাংশন কল এবং তাদের লোকাল ভেরিয়েবল স্ট্যাকের উপরে রাখা হয়।
- মেমোরি সাইজ সীমিত: স্ট্যাকের মেমোরি পরিমাণ সাধারণত ছোট হয়, যা সীমিত সংখ্যক লোকাল ভেরিয়েবল ধারণ করতে সক্ষম।
- অটোমেটিক মেমোরি ম্যানেজমেন্ট: স্ট্যাকের মেমোরি অটোমেটিক্যালি ব্যবস্থাপনা করা হয় (ফাংশন কল শেষ হওয়ার পর নিজে থেকে মুছে যায়)।
উদাহরণ:
fn function() {
let x = 10; // লোকাল ভেরিয়েবল x স্ট্যাক মেমোরিতে রাখা হবে
println!("{}", x);
} // ফাংশন কল শেষ হওয়ার পর x মেমোরি থেকে মুছে যাবেএখানে x একটি লোকাল ভেরিয়েবল যা function() ফাংশনের ভিতরে স্ট্যাকের মধ্যে রাখা হয়েছে। ফাংশন শেষ হলে এটি স্ট্যাক থেকে মুছে যাবে।
Heap (হিপ)
হিপ হল একটি ডাইনামিক মেমোরি এলাকা যেখানে ডেটা ডাইনামিকভাবে অ্যালোকেট করা হয় এবং সেখানে ডেটা অ্যাক্সেসের জন্য নির্দিষ্ট অবস্থান (pointers) ব্যবহৃত হয়। এটি সাধারণত বড় এবং পরিবর্তনশীল ডেটা সংগ্রহের জন্য ব্যবহৃত হয়, যেমন অ্যারে, স্ট্রিং ইত্যাদি, যা রানটাইমে মেমোরি ম্যানেজমেন্টের মাধ্যমে স্থায়ী হতে পারে।
হিপের বৈশিষ্ট্য:
- ডাইনামিক মেমোরি অ্যাক্সেস: হিপে ডেটা স্থাপন করতে প্রোগ্রামারকে মেমোরি অ্যালোকেট করতে হয় (যেমন
Box,Vec,Stringইত্যাদি ব্যবহার করে) এবং পরবর্তীতে ডেটা মুছে ফেলার জন্য ডিলোকেশন করতে হয়। - বড় মেমোরি সাইজ: হিপের মেমোরি সাইজ স্ট্যাকের তুলনায় অনেক বড় এবং প্রোগ্রাম চলাকালীন সময়ে এর সাইজ পরিবর্তন হতে পারে।
- ম্যানুয়াল মেমোরি ম্যানেজমেন্ট: হিপের মেমোরি ম্যানেজমেন্ট প্রোগ্রামারকে করতে হয়, যদিও রাস্ট তার মালিকানা (ownership) এবং বোরোউ (borrowing) সিস্টেমের মাধ্যমে মেমোরি সেফটি নিশ্চিত করে।
- ধীর অ্যাক্সেস: হিপের ডেটায় অ্যাক্সেস করতে স্ট্যাকের তুলনায় ধীর হতে পারে কারণ এর জন্য পয়েন্টার ব্যবহার করা হয় এবং মেমোরি সরাসরি অ্যাক্সেস করা হয় না।
উদাহরণ:
fn main() {
let s = String::from("Hello, Rust!"); // String একটি হিপ ডেটা টাইপ
println!("{}", s);
} // এখানে s এর মেমোরি হিপে অ্যালোকেট করা হয়েছে এবং প্রোগ্রাম শেষে মুছে যাবেএখানে String একটি হিপ ডেটা টাইপ, যার মেমোরি ডাইনামিকভাবে হিপে অ্যালোকেট করা হয়েছে এবং প্রোগ্রাম শেষ হলে এটি স্বয়ংক্রিয়ভাবে ডিলোকেট হবে।
Stack এবং Heap এর মধ্যে পার্থক্য
| পার্থক্য | Stack | Heap |
|---|---|---|
| ডেটা সংরক্ষণ পদ্ধতি | Last In, First Out (LIFO) | ডাইনামিক মেমোরি অ্যালোকেশন (যেমন পয়েন্টার) |
| মেমোরি ম্যানেজমেন্ট | অটোমেটিক (ফাংশন কল শেষ হলে মুছে যায়) | প্রোগ্রামারের মাধ্যমে (মেমোরি মুক্ত করতে হয়) |
| মেমোরি সাইজ | সীমিত এবং ছোট (ধরনযোগ্য) | বড়, সাইজ পরিবর্তনযোগ্য |
| অ্যাক্সেস স্পীড | দ্রুত (স্ট্যাকের উপরের অংশে অ্যাক্সেস করা হয়) | ধীর (পয়েন্টার এবং ডাইনামিক অ্যাক্সেস) |
| ব্যবহার | ফাংশন কল, লোকাল ভেরিয়েবল, রিটার্ন অ্যাড্রেস | বড় ডেটা (অ্যারে, স্ট্রিং, ভেক্টর) |
সারাংশ
- Stack হল একটি দ্রুত, সীমিত মেমোরি এলাকা যেখানে ফাংশন কল এবং লোকাল ভেরিয়েবল রাখা হয় এবং এটি স্বয়ংক্রিয়ভাবে মেমোরি ম্যানেজমেন্ট করে।
- Heap হল একটি বড় মেমোরি এলাকা যেখানে ডাইনামিক মেমোরি অ্যালোকেশন হয় এবং এখানে ডেটা স্থায়ীভাবে রাখতে হয়, তবে এটি স্লো অ্যাক্সেসের সাথে আসে।
রাস্টের ownership এবং borrowing সিস্টেম স্ট্যাক এবং হিপের মধ্যে সঠিক মেমোরি ম্যানেজমেন্ট নিশ্চিত করে, যাতে কোনো মেমোরি লিক বা অন্যান্য সমস্যা না হয়।
Read more